package model

import (
	"encoding/base64"
	"ginblog/utils/errmsg"
	"github.com/jinzhu/gorm"
	"golang.org/x/crypto/scrypt"
	"log"
)

// 用户表
type User struct {
	gorm.Model
	Username string `gorm:"type: varchar(20)" json:"username" validate:"required,min=4,max=12" label:"用户名"` // validate这些都是数据验证用的
	Password string `gorm:"type: varchar(20)" json:"password" validate:"required,min=6,max=20" label:"密码"`
	Role     int    `gorm:"type: int;DEFAULT:2" json:"role" validate:"required,gte=2" label:"角色"`
}

const (
	USER_ADMIN  = 1
	USER_NORMAL = 2
)

// 使用钩子函数加密  这个gorm自带的
func (u *User) BeforeSave() {
	u.Password = ScryptPw(u.Password)
}

// 密码加密
func ScryptPw(password string) string {
	const KeyLen = 10
	salt := make([]byte, 8)
	salt = []byte{12, 32, 4, 5, 212, 22, 11, 99}
	hashPw, err := scrypt.Key([]byte(password), salt, 16384, 8, 1, KeyLen)
	if err != nil {
		log.Fatal(err)
	}
	return base64.StdEncoding.EncodeToString(hashPw)
}

// 查询用户是否存在
func CheckUser(name string) (code int) {
	var users User
	// 使用这样的 SQL 预编译技术，除了可以防止 SQL 注入外，还可以对预编译的 SQL 语句进行缓存，之后的运行就省去了解析优化 SQL 语句的过程，可以加速 SQL 的查询。
	db.Select("id").Where("username = ?", name).First(&users)
	if users.ID > 0 {
		return errmsg.ERROR_USERNAME_USED
	}
	return errmsg.SUCESS
}

// 新增用户
func CreateUser(data *User) int {
	//data.Password = ScryptPw(data.Password)
	err := db.Create(data).Error
	if err != nil {
		return errmsg.ERROR
	}

	return errmsg.SUCESS
}

// 查询用户列表
func GetUsers(pageSize, pageNum int) (map[string]interface{}, int) {
	var users []User
	res := make(map[string]interface{})
	total := 0
	err := db.Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users).Count(&total).Error
	res["total"] = total
	if err != nil && err != gorm.ErrRecordNotFound {
		return nil, errmsg.ERROR
	}
	res["data"] = users
	return res, errmsg.SUCESS
}

// 编辑用户
func EditUser(id int, data *User) int {
	// 这个方式感觉很蠢

	var user User
	var maps = make(map[string]interface{})

	// 这里赋值了的就会更新
	if data.Username != "" {
		maps["username"] = data.Username
	}

	maps["role"] = data.Role
	err := db.Model(&user).Where("id = ?", id).Updates(maps).Error
	if err != nil {
		return errmsg.ERROR
	}
	return errmsg.SUCESS
}

// 删除用户
func DeleteUser(id int) int {
	err := db.Where("id=?", id).Delete(&User{}).Error
	if err != nil {
		return errmsg.ERROR
	}
	return errmsg.SUCESS
}

// 登陆验证
func CheckLogin(username, password string) int {
	var user User
	db.Where("username=?", username).First(&user)
	if user.ID == USER_ADMIN {
		return errmsg.ERROR_USER_NOT_EXIST
	}

	// 验证密码
	if ScryptPw(password) != user.Password {
		return errmsg.ERROR_PASSWORD_WROMG
	}

	// 是否是管理员
	if user.Role != 0 {
		return errmsg.ERROR_USER_NO_RIGHT
	}
	return errmsg.SUCESS
}
